package com.company.design.create.singleton.concurrency;

/**
 * @author yingfing
 * @create 2020--09--26 16:16
 * @describe 单例模式 - 加锁优化版 - 完美解决
 */
public class Singleton2 {
    // 1.私有静态实例 , 防止被引用 , 懒加载
    private static Singleton2 instance = null;

    // 2.私有化构造方法
    private Singleton2() {

    }
    // 3.静态方法 , 创建实例

    /**
     * 单例模式使用内部类来维护单例的实现,JVM内部的机制能够保证当一个类被加载的时候,这个类的加载过程是线程互斥的.
     * 这样当我们第一次调用 getInstance 的时候, JVM能够帮我们保证 instance 只能被创建一次,并且会保证把赋值给 instance 的内存初始化完毕,这样我们就不用担心上面的问题.
     */
    private static class SingletonFactory {
        private static Singleton2 instance = new Singleton2();
    }

    public static Singleton2 getInstance() {
        return SingletonFactory.instance;
    }
}
